Давайте создадим новый класс CClassFactory. Создавайте через New Class. В результате у Вас будут созданны два файла
ClassFactory.h ClassFactory.cppОписание класса необходимо изменить, чтобы он унаследовал интерфейс IClassFactory
#include "ole2.h"
class CClassFactory : public IClassFactory
{
public:
CClassFactory();
virtual ~CClassFactory();
};
Вот теперь, чтобы использовать наш класс надо подключить описание его в файл CPP самой библиотеки. Теперь мы можем попробовать объвить ссылку на класс фабрики классов.
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppv )
{
CClassFactory *cf;
cf=new CClassFactory;
return S_OK;
}
Так вот, если Вы напишите вот так, а это написано правильно, то получите кучу сообщений об ошибках. И правильно, сообщения примерно такие.
D:\PROJECT\MyCom\mycom.cpp(8) : warning C4259: 'long __stdcall IUnknown::QueryInterface(const struct _GUID &,void ** )' : pure virtual function was not defined
e:\microsoft visual studio\vc98\include\unknwn.h(109) : see declaration of 'QueryInterface'
D:\PROJECT\MyCom\mycom.cpp(8) : warning C4259: 'unsigned long __stdcall IUnknown::AddRef(void)' : pure virtual function was not defined
e:\microsoft visual studio\vc98\include\unknwn.h(113) : see declaration of 'AddRef'
Дествительно, реализация этих функций необходима. И мы должны были её сделать. Давайте объявим эти функции в классе. Эти объявления должны быть Вам хоть немного знакомы.
class CClassFactory : public IClassFactory
{
protected:
long m_lRef;
public:
CClassFactory();
virtual ~CClassFactory();
// IUnknown
STDMETHOD( QueryInterface(REFIID, void** ));
STDMETHOD_(ULONG, AddRef());
STDMETHOD_(ULONG, Release());
// IClassFactory
STDMETHOD(CreateInstance)(LPUNKNOWN, REFIID, void**);
STDMETHOD(LockServer)(BOOL);
};
Заметили, что методы есть и интерфейса IUnknown ? Хотя он не упоминается ? Нет упоминается. Фабрика классов наследуется от IUnknown из определения интерфейса:
MIDL_INTERFACE("00000001-0000-0000-C000-000000000046")
IClassFactory : public IUnknown
{
public:
......